#setwd("C:/Users/erussek/forage_jsp/analysis")
setwd("/Users/evanrussek/forage_jsp/analysis")
rm(list = ls())
library(tidyr)
Attaching package: ‘tidyr’
The following object is masked from ‘package:Matrix’:
expand
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(zoo)
Attaching package: ‘zoo’
The following objects are masked from ‘package:base’:
as.Date, as.Date.numeric
library(ggplot2)
library(ggpubr)
Loading required package: magrittr
Attaching package: ‘magrittr’
The following object is masked from ‘package:tidyr’:
extract
library(RcppRoll)
library(knitr)
data <- read.csv('data/run4_data.csv')
head(data)
data <- data %>% ungroup() %>% bind_cols(s_num = group_indices(., subjectID))
data <- data %>% mutate(subj = factor(s_num))
travel_keys = data %>% ungroup() %>% select(travel_key) %>% unique()
clean_subj_data <- function(subj_data, travel_keys){
travel_key_hard = travel_keys$travel_key[1]
travel_key_easy = travel_keys$travel_key[2]
subj_data <- data %>%select(round, phase, reward_obs, reward_true, lag, exit, start_reward, n_travel_steps,
travel_key, subjectID, trial_num, s_num, correct_key) %>% group_by(trial_num) %>%
mutate(press_num = 1:n(), round = as.factor(round),
rep_number = case_when(trial_num < 7 ~ 1, TRUE ~ 2)) %>%
mutate(phase = replace(phase, phase == "Harvest", "HARVEST"))
subj_data <- subj_data %>% group_by(trial_num) %>%
mutate(travel_key = replace(travel_key, travel_key == "", first(travel_key[travel_key != ""]))) %>%
mutate(travel_key_cond = case_when(travel_key == travel_key_hard ~ "HARD",
travel_key == travel_key_easy ~ "EASY")) %>%
filter(!is.na(travel_key_cond))
}
# clean all the data and bind
datalist <- list()
for (i in 1:10){
subj_data <- data %>% filter(s_num == i)
subj_data <- clean_subj_data(subj_data, travel_keys)
subj_data <- ungroup(subj_data)
datalist[[i]] <- subj_data
}
Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorUnequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
#cdata <- do.call(rbind,datalist)
cdata <- bind_rows(datalist)
# make a function to plot reward on each game...
plot_subj_reward_v_press <- function(subj_data){
s_num <- subj_data$s_num[1]
# reward plots which show the threshold...
rew_plot <- ggplot(subj_data, aes(x = press_num, y = reward_obs, group = round)) +
#geom_rect(data = t1_data, aes(xmin = press_num - 0.5, xmax = press_num + 0.5, ymin = -Inf, ymax = Inf, fill = round)) +
geom_point(aes(color = phase)) + facet_grid(n_travel_steps ~ travel_key_cond) + theme(legend.position = "none") + ylim(0,110) + ggtitle(paste("subj: ", s_num)) + ylab('reward collected') + xlab('button press number') + theme_minimal()
# plot_an <- annotate_figure(plot, top = paste('subj: ', s_num))
plot(rew_plot)
}
for (s in 1:22){
subj_data <- cdata %>% filter(s_num == s)
subj_data$round_num <- as.integer(as.character(subj_data$round))
#subj_data <- subj_data %>% group_by(travel_key_cond, n_travel_steps) %>% mutate(press_num = 1:n()) %>% ungroup()
plot_subj_reward_v_press(subj_data)
}






















subj_data$round_num
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[41] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[81] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[121] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[161] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[201] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[241] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[281] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[321] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[361] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[401] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[441] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[481] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[521] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[561] 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[601] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[641] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
[681] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[721] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[761] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[801] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[841] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[881] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
[921] 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[961] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6
[ reached getOption("max.print") -- omitted 32240 entries ]
get_trial_exits <- function(thdata){
# get harvest
last_phase <- last(thdata$phase)
# go through data.. if last phase was harvest, remove that round...
if (last_phase == "HARVEST"){
last_round <- last(thdata$round)
# get the last reward ops...
last_reward_ob <- last(thdata$reward_obs[!is.na(thdata$reward_obs)])
#if (last_reward_ob > 8){
thdata <- thdata %>% filter(round != last_round)
#}
}
# now select harvest data
thdata <- thdata %>% filter(phase == "HARVEST", !is.na(reward_obs)) # find out why reward_true has so many .na
## get either last true reward observed
return_tbl <- thdata %>%
group_by(round) %>%
summarise(s_num = first(s_num), last_reward = last(reward_obs),
trial_num = first(trial_num),
n_travel_steps = first(n_travel_steps),
travel_key_cond = first(travel_key_cond),
rep_number = first(rep_number)) %>% ungroup()
return(return_tbl)
}
#sdata %>% group_by(trial_num) %>%
# do(get_trial_exits(.))
exit_data <- cdata %>% group_by(s_num, trial_num) %>%
do(get_trial_exits(.)) %>% ungroup() %>% mutate(subj = as.factor(s_num))
library(ggpubr)
exit_data <- exit_data %>% mutate(round_num = as.integer(as.character(round)))
for (s in 1:22){
p <- ggplot(exit_data %>% filter(s_num == s), aes(x = round_num, y = last_reward)) + geom_point() + geom_line() +
facet_grid(n_travel_steps ~ travel_key_cond) + theme_minimal() + ylim(0,100) + ylab('last reward collected') + xlab('harvest number')
#plot(p)
#ggarrange(p)
a <- annotate_figure(p, right = "# travel steps", top = "travel step difficulty", fig.lab = paste('subj: ' , s))
plot(a)
}
geom_path: Each group consists of only one observation. Do you need to adjust the group aesthetic?























# do some aggregating over exit thresholds...
# just get the mean for each subject for each timepoint, collapse accross rep number...
mn_exit <- exit_data %>% group_by(s_num, n_travel_steps, travel_key_cond) %>%
summarise(rep_exit_thresh = mean(last_reward), trial_num = mean(trial_num)) %>%
group_by(s_num, n_travel_steps, travel_key_cond) %>%
summarise(exit_thresh = mean(rep_exit_thresh), trial_num = mean(trial_num)) %>%
mutate(subj = as.factor(s_num)) %>% ungroup()
Unequal factor levels: coercing to characterbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
# now just plot this for each subject -- draw lines to show easy - hard effect
ggplot(mn_exit, aes(x = travel_key_cond, y = exit_thresh)) + geom_dotplot(binaxis = 'y', aes(fill = subj), dotsize = 1.2) + geom_line(aes(group = subj, color = subj), size = 1.2) +
facet_grid(.~n_travel_steps) + theme_minimal() + labs(y = 'Mean Last Reward Collected', x = 'Travel Sequence', subtitle = '# Travel Presses') #theme(legend.position = "none")
ggsave('reward_press2.png')
Saving 7.29 x 4.51 in image

ggplot(mn_exit, aes(x = factor(n_travel_steps), y = exit_thresh)) +
geom_dotplot(binaxis = 'y', aes(fill = subj), dotsize = 1.2) +
geom_line(aes(group = subj, color = subj), size = 1.2) +
facet_grid(.~travel_key_cond) +
theme_gray() +
labs(y = 'Mean Last Reward Collected', x = 'Travel Key Condition', subtitle = '# Travel Presses')
#theme(legend.position = "none")
ggsave('reward_press.png')
Saving 7.29 x 4.51 in image

# plot the means for each of these...
gmn_exit <- mn_exit %>% group_by(n_travel_steps, travel_key_cond) %>% summarise(gm_thresh = mean(exit_thresh), gsd_thresh = sd(exit_thresh)/sqrt(n()))
ggplot(gmn_exit, aes(x = factor(n_travel_steps), y = gm_thresh, color = travel_key_cond)) +
geom_line(aes(group = travel_key_cond), size = 2) +
geom_errorbar(aes(ymin = gm_thresh - gsd_thresh, ymax = gm_thresh+gsd_thresh), width = .1, size = 2) +
geom_point(size = 4) + ylab('group mean exit threshold') + xlab('# travel steps') + labs(color = 'travel effort') + theme_minimal()
ggsave('group mean exit thresh.png')
Saving 7.29 x 4.51 in image

library(optimx)
library(lmerTest)
exit_model <- lmer(last_reward ~ n_travel_steps + travel_key_cond + (1 + n_travel_steps + travel_key_cond |subj), data = exit_data, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
summary(exit_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: last_reward ~ n_travel_steps + travel_key_cond + (1 + n_travel_steps + travel_key_cond | subj)
Data: exit_data
Control: lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 6956.1
Scaled residuals:
Min 1Q Median 3Q Max
-4.1827 -0.5108 0.0002 0.5046 5.3563
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 290.72330 17.0506
n_travel_steps 0.06055 0.2461 -0.27
travel_key_condHARD 68.01256 8.2470 -0.25 0.26
Residual 87.82008 9.3712
Number of obs: 928, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 54.95291 3.71001 20.77742 14.812 1.63e-12 ***
n_travel_steps -0.24696 0.06318 19.11207 -3.909 0.000935 ***
travel_key_condHARD -5.06293 1.89212 17.91918 -2.676 0.015465 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_
n_trvl_stps -0.309
trvl_k_HARD -0.256 0.206
library(broom.mixed)
td <- tidy(exit_model, conf.int = TRUE)
tdsome <- td %>% filter(term == 'n_travel_steps' | term == 'travel_key_condHARD')
tdsome <- tdsome %>% mutate(parameter = case_when(term == 'n_travel_steps' ~ 'travel step', term == 'travel_key_condHARD' ~ 'travel effort cond'))
ggplot(tdsome, aes(estimate,parameter,color = parameter)) +
geom_point(size = 2) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), size = 1.2) + theme(legend.position = "none") + theme_minimal() + ylab('fixed effect') + xlab('estimate (# points)') + ggtitle('linear mixed effects model - effect on exit threshold') + theme(axis.text.y = element_text(angle = 90, hjust = .5))
ggsave('exit model.png')
Saving 7.29 x 4.51 in image

# reaction times...
## a bit more sensible...
lag_data <- cdata %>% select(s_num, rep_number, travel_key_cond, n_travel_steps, phase, trial_num, lag, correct_key, round, trial_num) %>% mutate(log_lag = log(lag)) %>% group_by(s_num, trial_num, round, phase) %>% slice(-1) %>% ungroup() %>% mutate(subj = as.factor(s_num))
ggplot(lag_data, aes(x=lag)) + geom_histogram(binwidth = 10) + xlim(50,300) + facet_wrap( ~ s_num)

#ggplot(lag_data, aes(x=log_lag)) + geom_histogram(binwidth = .01) + facet_wrap( ~ s_num)
filt_lag <- lag_data %>% group_by(s_num) %>% filter(log_lag < (mean(log_lag) + 2*sd(log_lag)) , log_lag > (mean(log_lag) - 2*sd(log_lag))) %>% ungroup()
ggplot(filt_lag, aes(x=lag)) + geom_histogram(binwidth = 10) + facet_wrap(~s_num) + xlim(50,350)

ggplot(filt_lag, aes(x=log_lag)) + geom_histogram(binwidth = .02) + facet_wrap(~s_num)

## with a run, plot the mean lag
round_filt_lag <- filt_lag %>%
group_by(s_num, n_travel_steps, travel_key_cond, round, phase) %>%
summarise(trial_num = first(trial_num), mean_lag = mean(lag), mean_log_lag = mean(log_lag)) %>% mutate(round_num = as.integer(as.character(round)))
for (s in 1:22){
# plot mean lag as a function of round number
p <- ggplot(round_filt_lag %>% filter(s_num == s), aes(x = round_num, y = mean_log_lag, color = phase)) + geom_point(size = 2) +facet_grid(n_travel_steps ~ travel_key_cond) + geom_line(size = 1.2) + xlab('harvest/travel number') + ylab('mean log lag') + ggtitle(paste('subj: ', s)) + theme_minimal()
plot(p)
}






















NA
NA
library(plotrix)
cond_round_filt_lag <- round_filt_lag %>%
group_by(n_travel_steps, travel_key_cond, round_num, phase) %>%
summarise(mean_log_lag = mean(mean_log_lag), sd_lag = std.error(mean_log_lag))
p <- ggplot(cond_round_filt_lag, aes(x = round_num, y = mean_log_lag, color = phase)) + geom_point(size = 2) +facet_grid(n_travel_steps ~ travel_key_cond) + geom_line(size = 1.2) + geom_linerange(aes(ymin = mean_log_lag - sd_lag, ymax = mean_log_lag + sd_lag)) +
xlab('harvest/travel number') + ylab('mean log lag') + ggtitle('group: ') + theme_minimal()
plot(p)

cond_round_filt_lag
trial_filt_lag <- round_filt_lag %>%
group_by(s_num, n_travel_steps, travel_key_cond, phase) %>%
summarise(trial_num = first(trial_num),
mean_lag = mean(mean_lag),
mean_log_lag = mean(mean_log_lag)) %>% ungroup() %>% mutate(s_num = as.factor(s_num))
ggplot(trial_filt_lag,
aes(x = factor(n_travel_steps), y = mean_log_lag, fill = s_num)) +
geom_point(aes(color = s_num), size = 2)+
geom_line(aes(group = s_num, color = s_num), size = 1.2) +
facet_grid(phase ~ travel_key_cond) + theme_minimal() + xlab('# travel steps') + ylab('log lag time')

ggplot(trial_filt_lag,
aes(x = travel_key_cond, y = mean_lag, fill = s_num)) +
geom_point(aes(color = s_num), size = 2)+
geom_line(aes(group = s_num, color = s_num), size = 1.2) +
facet_grid(phase ~ n_travel_steps) + theme_minimal()

group_lag <- trial_filt_lag %>% group_by(n_travel_steps, travel_key_cond, phase) %>% summarise(gm_lag = mean(mean_lag), gml_lag = mean(mean_log_lag)) %>% ungroup()
ggplot(group_lag, aes(x = factor(n_travel_steps), y = gml_lag, color = travel_key_cond)) +
geom_line(aes(group = travel_key_cond), size = 2) + facet_wrap(~phase) + geom_point(size = 2) +xlab('# travel steps') +
ylab('group mean log lag') + theme_minimal()

NA
NA
NA
harvest_lag <- round_filt_lag %>% ungroup() %>% filter(phase == "HARVEST") %>% mutate(subj = as.factor(s_num))
head(harvest_lag)
hl_model <- lmer(scale(mean_log_lag) ~ n_travel_steps + travel_key_cond + round_num + trial_num + (1 + n_travel_steps+ travel_key_cond + round_num + trial_num |subj), data = harvest_lag, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
summary(hl_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: scale(mean_log_lag) ~ n_travel_steps + travel_key_cond + round_num +
trial_num + (1 + n_travel_steps + travel_key_cond + round_num +
trial_num | subj)
Data: harvest_lag
Control: lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 1235.3
Scaled residuals:
Min 1Q Median 3Q Max
-5.5258 -0.4479 -0.0009 0.4449 6.6054
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 0.8066735 0.89815
n_travel_steps 0.0003903 0.01976 0.20
travel_key_condHARD 0.1625154 0.40313 -0.02 -0.36
round_num 0.0002204 0.01485 -0.19 0.30 0.40
trial_num 0.0057660 0.07593 -0.58 -0.60 0.02 -0.14
Residual 0.1498717 0.38713
Number of obs: 1030, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -0.016907 0.197840 21.640619 -0.085 0.932681
n_travel_steps -0.002604 0.004533 19.780497 -0.575 0.572061
travel_key_condHARD 0.083340 0.091057 19.493395 0.915 0.371243
round_num 0.025677 0.005413 10.465223 4.744 0.000695 ***
trial_num -0.006761 0.019242 18.808325 -0.351 0.729213
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_ t__HAR rnd_nm
n_trvl_stps 0.137
trvl_k_HARD -0.040 -0.298
round_num -0.215 0.237 0.268
trial_num -0.542 -0.533 -0.006 -0.082
library(broom.mixed)
td <- tidy(hl_model, conf.int = TRUE)
tdsome <- td %>% filter(term == 'n_travel_steps' | term == 'travel_key_condHARD' | term == 'round_num' | term == 'trial_num')
tdsome <- tdsome %>% mutate(parameter = case_when(term == 'n_travel_steps' ~ 'travel step', term == 'travel_key_condHARD' ~ 'travel effort cond', term == 'round_num' ~ 'round number', term == 'trial_num' ~ 'trial number'))
ggplot(tdsome, aes(estimate,parameter,color = parameter)) +
geom_point(size = 2) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), size = 1.2) + theme(legend.position = "none") + theme_minimal() + ylab('fixed effect') + xlab('estimate (sd log rt)') + ggtitle('linear mixed effects model - effect on lag - harvest presses') + theme(axis.text.y = element_text(angle = 90, hjust = .5))

travel_lag <- round_filt_lag %>% ungroup() %>% filter(phase == "TRAVEL") %>% mutate(subj = as.factor(s_num))
tl_model <- lmer(scale(mean_log_lag) ~ n_travel_steps*travel_key_cond + round_num + trial_num + (1 + n_travel_steps*travel_key_cond + round_num + trial_num |subj), data = travel_lag, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
convergence code 1 from optimxboundary (singular) fit: see ?isSingular
summary(tl_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: scale(mean_log_lag) ~ n_travel_steps * travel_key_cond + round_num +
trial_num + (1 + n_travel_steps * travel_key_cond + round_num + trial_num | subj)
Data: travel_lag
Control: lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 919.6
Scaled residuals:
Min 1Q Median 3Q Max
-5.8972 -0.5267 -0.0053 0.5193 4.9564
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 0.2709010 0.52048
n_travel_steps 0.0004442 0.02108 0.40
travel_key_condHARD 0.2821369 0.53117 0.28 0.13
round_num 0.0005459 0.02336 -0.16 -0.17 0.11
trial_num 0.0093260 0.09657 -0.59 -0.37 -0.37 0.15
n_travel_steps:travel_key_condHARD 0.0001886 0.01373 -0.14 -0.86 -0.29 -0.28 0.19
Residual 0.1025152 0.32018
Number of obs: 1065, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -0.453891 0.120232 21.484655 -3.775 0.00108 **
n_travel_steps -0.002340 0.004878 17.764615 -0.480 0.63723
travel_key_condHARD 1.248245 0.124035 20.361977 10.064 2.37e-09 ***
round_num 0.018594 0.006411 11.569233 2.901 0.01376 *
trial_num -0.040759 0.022544 15.132220 -1.808 0.09052 .
n_travel_steps:travel_key_condHARD 0.010102 0.003814 22.209233 2.649 0.01459 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_ t__HAR rnd_nm trl_nm
n_trvl_stps 0.250
trvl_k_HARD 0.148 0.205
round_num -0.219 -0.088 0.108
trial_num -0.561 -0.359 -0.323 0.086
n_t_:__HARD 0.023 -0.768 -0.427 -0.198 0.133
convergence code: 1
boundary (singular) fit: see ?isSingular
travel_hard_lag <- round_filt_lag %>% ungroup() %>% filter(phase == "TRAVEL", travel_key_cond == "HARD") %>% mutate(subj = as.factor(s_num))
thl_model <- lmer(scale(mean_log_lag) ~ n_travel_steps + round_num + trial_num + (1 + n_travel_steps + round_num + trial_num |subj), data = travel_hard_lag, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
summary(thl_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's
method [lmerModLmerTest]
Formula:
scale(mean_log_lag) ~ n_travel_steps + round_num + trial_num +
(1 + n_travel_steps + round_num + trial_num | subj)
Data: travel_hard_lag
Control:
lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 639.5
Scaled residuals:
Min 1Q Median 3Q Max
-6.1332 -0.5312 -0.0211 0.4813 5.1650
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 1.0618889 1.03048
n_travel_steps 0.0001318 0.01148 0.07
round_num 0.0024235 0.04923 -0.22 0.39
trial_num 0.0126185 0.11233 -0.53 -0.16 0.50
Residual 0.1582722 0.39783
Number of obs: 461, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.102854 0.233386 20.044025 0.441 0.6641
n_travel_steps 0.012419 0.003756 13.541207 3.307 0.0054
round_num 0.008826 0.013920 13.541148 0.634 0.5366
trial_num -0.060142 0.030116 11.392098 -1.997 0.0703
(Intercept)
n_travel_steps **
round_num
trial_num .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_ rnd_nm
n_trvl_stps -0.055
round_num -0.279 0.311
trial_num -0.512 -0.271 0.305
library(broom.mixed)
td <- tidy(thl_model, conf.int = TRUE)
tdsome <- td %>% filter(term == 'n_travel_steps' | term == 'travel_key_condHARD' | term == 'round_num' | term == "trial_num")
tdsome <- tdsome %>% mutate(parameter = case_when(term == 'n_travel_steps' ~ 'travel step', term == 'travel_key_condHARD' ~ 'travel effort cond', term == 'round_num' ~ 'round number', term == 'trial_num' ~ 'trial number'))
ggplot(tdsome, aes(estimate,parameter,color = parameter)) +
geom_point(size = 2) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), size = 1.2) + theme(legend.position = "none") + theme_minimal() + ylab('fixed effect') + xlab('sd log lag') + ggtitle('linear mixed effects model - effect on lag - hard travel presses') + theme(axis.text.y = element_text(angle = 90, hjust = .5))

travel_easy_lag <- round_filt_lag %>% ungroup() %>% filter(phase == "TRAVEL", travel_key_cond == "EASY") %>% mutate(subj = as.factor(s_num))
tel_model <- lmer(scale(mean_log_lag) ~ n_travel_steps + round_num + trial_num + (1 + n_travel_steps + round_num + trial_num |subj), data = travel_easy_lag, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
summary(tel_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: scale(mean_log_lag) ~ n_travel_steps + round_num + trial_num +
(1 + n_travel_steps + round_num + trial_num | subj)
Data: travel_easy_lag
Control: lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 889.1
Scaled residuals:
Min 1Q Median 3Q Max
-4.8124 -0.4839 -0.0207 0.4784 3.8018
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 0.912244 0.95511
n_travel_steps 0.001712 0.04138 0.40
round_num 0.001649 0.04061 -0.30 -0.36
trial_num 0.046682 0.21606 -0.66 -0.65 0.17
Residual 0.173302 0.41630
Number of obs: 604, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) 0.103375 0.223186 16.996980 0.463 0.64911
n_travel_steps -0.010612 0.009613 9.337431 -1.104 0.29727
round_num 0.035340 0.011024 15.285312 3.206 0.00578 **
trial_num -0.009579 0.053193 8.845525 -0.180 0.86115
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_ rnd_nm
n_trvl_stps 0.291
round_num -0.310 -0.230
trial_num -0.636 -0.629 0.110
td <- tidy(tel_model, conf.int = TRUE)
tdsome <- td %>% filter(term == 'n_travel_steps' | term == 'travel_key_condHARD' | term == 'round_num' | term == "trial_num")
tdsome <- tdsome %>% mutate(parameter = case_when(term == 'n_travel_steps' ~ 'travel step', term == 'travel_key_condHARD' ~ 'travel effort cond', term == 'round_num' ~ 'round number', term == 'trial_num' ~ 'trial number'))
ggplot(tdsome, aes(estimate,parameter,color = parameter)) +
geom_point(size = 2) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), size = 1.2) + theme(legend.position = "none") + theme_minimal() + ylab('fixed effect') + xlab('sd log lag') + ggtitle('linear mixed effects model - effect on lag - travel easy presses') + theme(axis.text.y = element_text(angle = 90, hjust = .5))

travel_lag <- round_filt_lag %>% ungroup() %>% filter(phase == "TRAVEL") %>% mutate(subj = as.factor(s_num))
tl_model <- lmer(scale(mean_log_lag) ~ n_travel_steps*travel_key_cond + round_num + trial_num + (1 + n_travel_steps*travel_key_cond + round_num + trial_num |subj), data = travel_lag, control = lmerControl(optimizer ="optimx",optCtrl=list(method='nlminb')))
convergence code 1 from optimxboundary (singular) fit: see ?isSingular
summary(tl_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: scale(mean_log_lag) ~ n_travel_steps * travel_key_cond + round_num +
trial_num + (1 + n_travel_steps * travel_key_cond + round_num +
trial_num | subj)
Data: travel_lag
Control: lmerControl(optimizer = "optimx", optCtrl = list(method = "nlminb"))
REML criterion at convergence: 919.6
Scaled residuals:
Min 1Q Median 3Q Max
-5.8972 -0.5267 -0.0053 0.5193 4.9564
Random effects:
Groups Name Variance Std.Dev. Corr
subj (Intercept) 0.2709010 0.52048
n_travel_steps 0.0004442 0.02108 0.40
travel_key_condHARD 0.2821369 0.53117 0.28 0.13
round_num 0.0005459 0.02336 -0.16 -0.17 0.11
trial_num 0.0093260 0.09657 -0.59 -0.37 -0.37 0.15
n_travel_steps:travel_key_condHARD 0.0001886 0.01373 -0.14 -0.86 -0.29 -0.28
Residual 0.1025152 0.32018
0.19
Number of obs: 1065, groups: subj, 22
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)
(Intercept) -0.453891 0.120232 21.484655 -3.775 0.00108 **
n_travel_steps -0.002340 0.004878 17.764615 -0.480 0.63723
travel_key_condHARD 1.248245 0.124035 20.361977 10.064 2.37e-09 ***
round_num 0.018594 0.006411 11.569233 2.901 0.01376 *
trial_num -0.040759 0.022544 15.132220 -1.808 0.09052 .
n_travel_steps:travel_key_condHARD 0.010102 0.003814 22.209233 2.649 0.01459 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Correlation of Fixed Effects:
(Intr) n_trv_ t__HAR rnd_nm trl_nm
n_trvl_stps 0.250
trvl_k_HARD 0.148 0.205
round_num -0.219 -0.088 0.108
trial_num -0.561 -0.359 -0.323 0.086
n_t_:__HARD 0.023 -0.768 -0.427 -0.198 0.133
convergence code: 1
boundary (singular) fit: see ?isSingular
#term == 'travel_key_condHARD'
td <- tidy(tl_model, conf.int = TRUE)
tdsome <- td %>% filter(term == 'n_travel_steps' | term == 'round_num' | term == "trial_num" | term == "n_travel_steps:travel_key_condHARD")
tdsome <- tdsome %>% mutate(parameter = case_when(term == 'n_travel_steps' ~ '# step', term == 'travel_key_condHARD' ~ 'effort', term == 'round_num' ~ 'round', term == 'trial_num' ~ 'trial', term == 'n_travel_steps:travel_key_condHARD' ~ '#step x effort'))
ggplot(tdsome, aes(estimate,parameter,color = parameter)) +
geom_point(size = 2) +
geom_errorbarh(aes(xmin = conf.low, xmax = conf.high), size = 1.2) + theme(legend.position = "none") + theme_minimal() + ylab('fixed effect') + xlab('sd log lag') + ggtitle('linear mixed effects model - effect on lag - travel') + theme(axis.text.y = element_text(angle = 90, hjust = .5))

td
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgoKCmBgYHtyfQojc2V0d2QoIkM6L1VzZXJzL2VydXNzZWsvZm9yYWdlX2pzcC9hbmFseXNpcyIpCnNldHdkKCIvVXNlcnMvZXZhbnJ1c3Nlay9mb3JhZ2VfanNwL2FuYWx5c2lzIikKcm0obGlzdCA9IGxzKCkpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoem9vKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dwdWJyKQpsaWJyYXJ5KFJjcHBSb2xsKQpsaWJyYXJ5KGtuaXRyKQpgYGAKCmBgYHtyfQpkYXRhIDwtIHJlYWQuY3N2KCdkYXRhL3J1bjRfZGF0YS5jc3YnKQpoZWFkKGRhdGEpCmRhdGEgPC0gZGF0YSAlPiUgdW5ncm91cCgpICU+JSBiaW5kX2NvbHMoc19udW0gPSBncm91cF9pbmRpY2VzKC4sIHN1YmplY3RJRCkpCmRhdGEgPC0gZGF0YSAlPiUgbXV0YXRlKHN1YmogPSBmYWN0b3Ioc19udW0pKQpgYGAKCmBgYHtyfQp0cmF2ZWxfa2V5cyA9IGRhdGEgJT4lIHVuZ3JvdXAoKSAlPiUgc2VsZWN0KHRyYXZlbF9rZXkpICU+JSB1bmlxdWUoKQpjbGVhbl9zdWJqX2RhdGEgPC0gZnVuY3Rpb24oc3Vial9kYXRhLCB0cmF2ZWxfa2V5cyl7CiAgdHJhdmVsX2tleV9oYXJkID0gdHJhdmVsX2tleXMkdHJhdmVsX2tleVsxXQogIHRyYXZlbF9rZXlfZWFzeSA9IHRyYXZlbF9rZXlzJHRyYXZlbF9rZXlbMl0KICAKICBzdWJqX2RhdGEgPC0gZGF0YSAlPiVzZWxlY3Qocm91bmQsIHBoYXNlLCByZXdhcmRfb2JzLCByZXdhcmRfdHJ1ZSwgbGFnLCBleGl0LCBzdGFydF9yZXdhcmQsIG5fdHJhdmVsX3N0ZXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZWxfa2V5LCBzdWJqZWN0SUQsIHRyaWFsX251bSwgc19udW0sIGNvcnJlY3Rfa2V5KSAlPiUgZ3JvdXBfYnkodHJpYWxfbnVtKSAlPiUKICAgIG11dGF0ZShwcmVzc19udW0gPSAxOm4oKSwgcm91bmQgPSBhcy5mYWN0b3Iocm91bmQpLCAKICAgICAgICAgICByZXBfbnVtYmVyID0gY2FzZV93aGVuKHRyaWFsX251bSA8IDcgfiAxLCBUUlVFIH4gMikpICU+JQogICAgbXV0YXRlKHBoYXNlID0gcmVwbGFjZShwaGFzZSwgcGhhc2UgPT0gIkhhcnZlc3QiLCAiSEFSVkVTVCIpKQoKICBzdWJqX2RhdGEgPC0gc3Vial9kYXRhICU+JSBncm91cF9ieSh0cmlhbF9udW0pICU+JSAKICAgIG11dGF0ZSh0cmF2ZWxfa2V5ID0gcmVwbGFjZSh0cmF2ZWxfa2V5LCB0cmF2ZWxfa2V5ID09ICIiLCBmaXJzdCh0cmF2ZWxfa2V5W3RyYXZlbF9rZXkgIT0gIiJdKSkpICU+JQogICAgbXV0YXRlKHRyYXZlbF9rZXlfY29uZCA9IGNhc2Vfd2hlbih0cmF2ZWxfa2V5ID09IHRyYXZlbF9rZXlfaGFyZCAgIH4gIkhBUkQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZWxfa2V5ID09IHRyYXZlbF9rZXlfZWFzeSAgfiAiRUFTWSIpKSAlPiUKICAgIGZpbHRlcighaXMubmEodHJhdmVsX2tleV9jb25kKSkKfQoKIyBjbGVhbiBhbGwgdGhlIGRhdGEgYW5kIGJpbmQKZGF0YWxpc3QgPC0gbGlzdCgpCmZvciAoaSBpbiAxOjEwKXsKICBzdWJqX2RhdGEgPC0gZGF0YSAlPiUgZmlsdGVyKHNfbnVtID09IGkpCiAgc3Vial9kYXRhIDwtIGNsZWFuX3N1YmpfZGF0YShzdWJqX2RhdGEsIHRyYXZlbF9rZXlzKQogIHN1YmpfZGF0YSA8LSB1bmdyb3VwKHN1YmpfZGF0YSkKICBkYXRhbGlzdFtbaV1dIDwtIHN1YmpfZGF0YQp9CiNjZGF0YSA8LSBkby5jYWxsKHJiaW5kLGRhdGFsaXN0KQpjZGF0YSA8LSBiaW5kX3Jvd3MoZGF0YWxpc3QpCmBgYApgYGB7cn0KIyBtYWtlIGEgZnVuY3Rpb24gdG8gcGxvdCByZXdhcmQgb24gZWFjaCBnYW1lLi4uIApwbG90X3N1YmpfcmV3YXJkX3ZfcHJlc3MgPC0gZnVuY3Rpb24oc3Vial9kYXRhKXsKICAKICBzX251bSA8LSBzdWJqX2RhdGEkc19udW1bMV0KICAKICAjIHJld2FyZCBwbG90cyB3aGljaCBzaG93IHRoZSB0aHJlc2hvbGQuLi4gCiAgcmV3X3Bsb3QgPC0gZ2dwbG90KHN1YmpfZGF0YSwgYWVzKHggPSBwcmVzc19udW0sIHkgPSByZXdhcmRfb2JzLCBncm91cCA9IHJvdW5kKSkgICsKICAgICNnZW9tX3JlY3QoZGF0YSA9IHQxX2RhdGEsIGFlcyh4bWluID0gcHJlc3NfbnVtIC0gMC41LCB4bWF4ID0gcHJlc3NfbnVtICsgMC41LCB5bWluID0gLUluZiwgeW1heCA9IEluZiwgZmlsbCA9IHJvdW5kKSkgKwogICAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwaGFzZSkpICsgZmFjZXRfZ3JpZChuX3RyYXZlbF9zdGVwcyB+IHRyYXZlbF9rZXlfY29uZCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgeWxpbSgwLDExMCkgKyBnZ3RpdGxlKHBhc3RlKCJzdWJqOiAiLCBzX251bSkpICsgeWxhYigncmV3YXJkIGNvbGxlY3RlZCcpICsgeGxhYignYnV0dG9uIHByZXNzIG51bWJlcicpICsgdGhlbWVfbWluaW1hbCgpCiAgCiAjIHBsb3RfYW4gPC0gYW5ub3RhdGVfZmlndXJlKHBsb3QsIHRvcCA9IHBhc3RlKCdzdWJqOiAnLCBzX251bSkpCiAgcGxvdChyZXdfcGxvdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKfQpmb3IgKHMgaW4gMToyMil7CiAgc3Vial9kYXRhIDwtIGNkYXRhICU+JSBmaWx0ZXIoc19udW0gPT0gcykKICBzdWJqX2RhdGEkcm91bmRfbnVtIDwtIGFzLmludGVnZXIoYXMuY2hhcmFjdGVyKHN1YmpfZGF0YSRyb3VuZCkpCgogICNzdWJqX2RhdGEgPC0gc3Vial9kYXRhICU+JSBncm91cF9ieSh0cmF2ZWxfa2V5X2NvbmQsIG5fdHJhdmVsX3N0ZXBzKSAlPiUgbXV0YXRlKHByZXNzX251bSA9IDE6bigpKSAlPiUgdW5ncm91cCgpCiAgcGxvdF9zdWJqX3Jld2FyZF92X3ByZXNzKHN1YmpfZGF0YSkgIAp9CmBgYApgYGB7cn0Kc3Vial9kYXRhJHJvdW5kX251bSAKYGBgCgoKYGBge3J9CmdldF90cmlhbF9leGl0cyA8LSBmdW5jdGlvbih0aGRhdGEpewogICAgIyBnZXQgaGFydmVzdAogIGxhc3RfcGhhc2UgPC0gbGFzdCh0aGRhdGEkcGhhc2UpCiAgCiAgIyBnbyB0aHJvdWdoIGRhdGEuLiBpZiBsYXN0IHBoYXNlIHdhcyBoYXJ2ZXN0LCByZW1vdmUgdGhhdCByb3VuZC4uLiAKICBpZiAobGFzdF9waGFzZSA9PSAiSEFSVkVTVCIpewogICAgbGFzdF9yb3VuZCA8LSBsYXN0KHRoZGF0YSRyb3VuZCkKICAgICMgZ2V0IHRoZSBsYXN0IHJld2FyZCBvcHMuLi4KICAgIGxhc3RfcmV3YXJkX29iIDwtIGxhc3QodGhkYXRhJHJld2FyZF9vYnNbIWlzLm5hKHRoZGF0YSRyZXdhcmRfb2JzKV0pCiAgICAKICAgICNpZiAobGFzdF9yZXdhcmRfb2IgPiA4KXsKICAgIHRoZGF0YSA8LSB0aGRhdGEgJT4lIGZpbHRlcihyb3VuZCAhPSBsYXN0X3JvdW5kKQogICAgI30KICB9CiAgCiAgIyBub3cgc2VsZWN0IGhhcnZlc3QgZGF0YQogIHRoZGF0YSA8LSB0aGRhdGEgJT4lIGZpbHRlcihwaGFzZSA9PSAiSEFSVkVTVCIsICFpcy5uYShyZXdhcmRfb2JzKSkgIyBmaW5kIG91dCB3aHkgcmV3YXJkX3RydWUgaGFzIHNvIG1hbnkgLm5hCiAgCiAgIyMgZ2V0IGVpdGhlciBsYXN0IHRydWUgcmV3YXJkIG9ic2VydmVkCiAgcmV0dXJuX3RibCA8LSB0aGRhdGEgJT4lIAogICAgICAgICAgICAgICAgICBncm91cF9ieShyb3VuZCkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgc3VtbWFyaXNlKHNfbnVtID0gZmlyc3Qoc19udW0pLCBsYXN0X3Jld2FyZCA9IGxhc3QocmV3YXJkX29icyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpYWxfbnVtID0gZmlyc3QodHJpYWxfbnVtKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuX3RyYXZlbF9zdGVwcyA9IGZpcnN0KG5fdHJhdmVsX3N0ZXBzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB0cmF2ZWxfa2V5X2NvbmQgPSBmaXJzdCh0cmF2ZWxfa2V5X2NvbmQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlcF9udW1iZXIgPSBmaXJzdChyZXBfbnVtYmVyKSkgJT4lIHVuZ3JvdXAoKQogIHJldHVybihyZXR1cm5fdGJsKQp9Cgojc2RhdGEgJT4lIGdyb3VwX2J5KHRyaWFsX251bSkgJT4lCiMgIGRvKGdldF90cmlhbF9leGl0cyguKSkKCmV4aXRfZGF0YSA8LSBjZGF0YSAlPiUgZ3JvdXBfYnkoc19udW0sIHRyaWFsX251bSkgJT4lCiAgZG8oZ2V0X3RyaWFsX2V4aXRzKC4pKSAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUoc3ViaiA9IGFzLmZhY3RvcihzX251bSkpCmBgYAoKYGBge3J9CmxpYnJhcnkoZ2dwdWJyKQpleGl0X2RhdGEgPC0gZXhpdF9kYXRhICU+JSBtdXRhdGUocm91bmRfbnVtID0gYXMuaW50ZWdlcihhcy5jaGFyYWN0ZXIocm91bmQpKSkKZm9yIChzIGluIDE6MjIpewogIHAgPC0gZ2dwbG90KGV4aXRfZGF0YSAlPiUgZmlsdGVyKHNfbnVtID09IHMpLCBhZXMoeCA9IHJvdW5kX251bSwgeSA9IGxhc3RfcmV3YXJkKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX2xpbmUoKSArCiAgZmFjZXRfZ3JpZChuX3RyYXZlbF9zdGVwcyB+IHRyYXZlbF9rZXlfY29uZCkgKyB0aGVtZV9taW5pbWFsKCkgICsgeWxpbSgwLDEwMCkgKyB5bGFiKCdsYXN0IHJld2FyZCBjb2xsZWN0ZWQnKSArIHhsYWIoJ2hhcnZlc3QgbnVtYmVyJykKICAKICAjcGxvdChwKQogICNnZ2FycmFuZ2UocCkKICBhIDwtIGFubm90YXRlX2ZpZ3VyZShwLCByaWdodCA9ICIjIHRyYXZlbCBzdGVwcyIsIHRvcCA9ICJ0cmF2ZWwgc3RlcCBkaWZmaWN1bHR5IiwgZmlnLmxhYiA9IHBhc3RlKCdzdWJqOiAnICwgcykpCiAgcGxvdChhKQp9CgpgYGAKCmBgYHtyfQojIGRvIHNvbWUgYWdncmVnYXRpbmcgb3ZlciBleGl0IHRocmVzaG9sZHMuLi4gCiMganVzdCBnZXQgdGhlIG1lYW4gZm9yIGVhY2ggc3ViamVjdCBmb3IgZWFjaCB0aW1lcG9pbnQsIGNvbGxhcHNlIGFjY3Jvc3MgcmVwIG51bWJlci4uLgptbl9leGl0IDwtIGV4aXRfZGF0YSAlPiUgZ3JvdXBfYnkoc19udW0sIG5fdHJhdmVsX3N0ZXBzLCB0cmF2ZWxfa2V5X2NvbmQpICU+JQogIHN1bW1hcmlzZShyZXBfZXhpdF90aHJlc2ggPSBtZWFuKGxhc3RfcmV3YXJkKSwgdHJpYWxfbnVtID0gbWVhbih0cmlhbF9udW0pKSAlPiUgCiAgZ3JvdXBfYnkoc19udW0sIG5fdHJhdmVsX3N0ZXBzLCB0cmF2ZWxfa2V5X2NvbmQpICU+JQogIHN1bW1hcmlzZShleGl0X3RocmVzaCA9IG1lYW4ocmVwX2V4aXRfdGhyZXNoKSwgdHJpYWxfbnVtID0gbWVhbih0cmlhbF9udW0pKSAlPiUKICBtdXRhdGUoc3ViaiA9IGFzLmZhY3RvcihzX251bSkpICU+JSB1bmdyb3VwKCkKCiMgbm93IGp1c3QgcGxvdCB0aGlzIGZvciBlYWNoIHN1YmplY3QgLS0gZHJhdyBsaW5lcyB0byBzaG93IGVhc3kgLSBoYXJkIGVmZmVjdApnZ3Bsb3QobW5fZXhpdCwgYWVzKHggPSB0cmF2ZWxfa2V5X2NvbmQsIHkgPSBleGl0X3RocmVzaCkpICsgZ2VvbV9kb3RwbG90KGJpbmF4aXMgPSAneScsIGFlcyhmaWxsID0gc3ViaiksIGRvdHNpemUgPSAxLjIpICsgZ2VvbV9saW5lKGFlcyhncm91cCA9IHN1YmosIGNvbG9yID0gc3ViaiksIHNpemUgPSAxLjIpICsKICBmYWNldF9ncmlkKC5+bl90cmF2ZWxfc3RlcHMpICsgdGhlbWVfbWluaW1hbCgpICsgbGFicyh5ID0gJ01lYW4gTGFzdCBSZXdhcmQgQ29sbGVjdGVkJywgeCA9ICdUcmF2ZWwgU2VxdWVuY2UnLCBzdWJ0aXRsZSA9ICcjIFRyYXZlbCBQcmVzc2VzJykgI3RoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKZ2dzYXZlKCdyZXdhcmRfcHJlc3MyLnBuZycpCgoKZ2dwbG90KG1uX2V4aXQsIGFlcyh4ID0gZmFjdG9yKG5fdHJhdmVsX3N0ZXBzKSwgeSA9IGV4aXRfdGhyZXNoKSkgKwogIGdlb21fZG90cGxvdChiaW5heGlzID0gJ3knLCBhZXMoZmlsbCA9IHN1YmopLCBkb3RzaXplID0gMS4yKSArIAogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJqLCBjb2xvciA9IHN1YmopLCBzaXplID0gMS4yKSArCiAgZmFjZXRfZ3JpZCgufnRyYXZlbF9rZXlfY29uZCkgKyAKICB0aGVtZV9ncmF5KCkgKyAKICBsYWJzKHkgPSAnTWVhbiBMYXN0IFJld2FyZCBDb2xsZWN0ZWQnLCB4ID0gJ1RyYXZlbCBLZXkgQ29uZGl0aW9uJywgc3VidGl0bGUgPSAnIyBUcmF2ZWwgUHJlc3NlcycpIAogICN0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmdnc2F2ZSgncmV3YXJkX3ByZXNzLnBuZycpCgpgYGAKYGBge3J9CiMgcGxvdCB0aGUgbWVhbnMgZm9yIGVhY2ggb2YgdGhlc2UuLi4KZ21uX2V4aXQgPC0gbW5fZXhpdCAlPiUgZ3JvdXBfYnkobl90cmF2ZWxfc3RlcHMsIHRyYXZlbF9rZXlfY29uZCkgJT4lIHN1bW1hcmlzZShnbV90aHJlc2ggPSBtZWFuKGV4aXRfdGhyZXNoKSwgZ3NkX3RocmVzaCA9IHNkKGV4aXRfdGhyZXNoKS9zcXJ0KG4oKSkpCgpnZ3Bsb3QoZ21uX2V4aXQsIGFlcyh4ID0gZmFjdG9yKG5fdHJhdmVsX3N0ZXBzKSwgeSA9IGdtX3RocmVzaCwgY29sb3IgPSB0cmF2ZWxfa2V5X2NvbmQpKSArCiAgZ2VvbV9saW5lKGFlcyhncm91cCA9IHRyYXZlbF9rZXlfY29uZCksIHNpemUgPSAyKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGdtX3RocmVzaCAtIGdzZF90aHJlc2gsIHltYXggPSBnbV90aHJlc2grZ3NkX3RocmVzaCksIHdpZHRoID0gLjEsIHNpemUgPSAyKSArIApnZW9tX3BvaW50KHNpemUgPSA0KSArIHlsYWIoJ2dyb3VwIG1lYW4gZXhpdCB0aHJlc2hvbGQnKSArIHhsYWIoJyMgdHJhdmVsIHN0ZXBzJykgKyBsYWJzKGNvbG9yID0gJ3RyYXZlbCBlZmZvcnQnKSArIHRoZW1lX21pbmltYWwoKQpnZ3NhdmUoJ2dyb3VwIG1lYW4gZXhpdCB0aHJlc2gucG5nJykKCmBgYAoKYGBge3J9CgpsaWJyYXJ5KG9wdGlteCkKbGlicmFyeShsbWVyVGVzdCkKZXhpdF9tb2RlbCA8LSBsbWVyKGxhc3RfcmV3YXJkIH4gbl90cmF2ZWxfc3RlcHMgKyB0cmF2ZWxfa2V5X2NvbmQgICsgKDEgICsgbl90cmF2ZWxfc3RlcHMgKyB0cmF2ZWxfa2V5X2NvbmQgfHN1YmopLCBkYXRhID0gZXhpdF9kYXRhLCAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9Im9wdGlteCIsb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpKQpzdW1tYXJ5KGV4aXRfbW9kZWwpCiAgICAgICAgICAgICAgICAgICAKYGBgCgpgYGB7cn0KbGlicmFyeShicm9vbS5taXhlZCkKdGQgPC0gdGlkeShleGl0X21vZGVsLCBjb25mLmludCA9IFRSVUUpCnRkc29tZSA8LSB0ZCAlPiUgZmlsdGVyKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB8IHRlcm0gPT0gJ3RyYXZlbF9rZXlfY29uZEhBUkQnKQoKdGRzb21lIDwtIHRkc29tZSAlPiUgbXV0YXRlKHBhcmFtZXRlciA9IGNhc2Vfd2hlbih0ZXJtID09ICduX3RyYXZlbF9zdGVwcycgfiAndHJhdmVsIHN0ZXAnLCB0ZXJtID09ICd0cmF2ZWxfa2V5X2NvbmRIQVJEJyB+ICd0cmF2ZWwgZWZmb3J0IGNvbmQnKSkKCmdncGxvdCh0ZHNvbWUsIGFlcyhlc3RpbWF0ZSxwYXJhbWV0ZXIsY29sb3IgPSBwYXJhbWV0ZXIpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICArCmdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBzaXplID0gMS4yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB0aGVtZV9taW5pbWFsKCkgKyB5bGFiKCdmaXhlZCBlZmZlY3QnKSArIHhsYWIoJ2VzdGltYXRlICgjIHBvaW50cyknKSArIGdndGl0bGUoJ2xpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIC0gZWZmZWN0IG9uIGV4aXQgdGhyZXNob2xkJykgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IC41KSkKZ2dzYXZlKCdleGl0IG1vZGVsLnBuZycpCmBgYAoKYGBge3J9CiMgcmVhY3Rpb24gdGltZXMuLi4gCgoKIyMgYSBiaXQgbW9yZSBzZW5zaWJsZS4uLiAKbGFnX2RhdGEgPC0gY2RhdGEgJT4lIHNlbGVjdChzX251bSwgcmVwX251bWJlciwgdHJhdmVsX2tleV9jb25kLCBuX3RyYXZlbF9zdGVwcywgcGhhc2UsIHRyaWFsX251bSwgbGFnLCBjb3JyZWN0X2tleSwgcm91bmQsIHRyaWFsX251bSkgJT4lIG11dGF0ZShsb2dfbGFnID0gbG9nKGxhZykpICU+JSBncm91cF9ieShzX251bSwgdHJpYWxfbnVtLCByb3VuZCwgcGhhc2UpICU+JSBzbGljZSgtMSkgJT4lIHVuZ3JvdXAoKSAlPiUgbXV0YXRlKHN1YmogPSBhcy5mYWN0b3Ioc19udW0pKQoKZ2dwbG90KGxhZ19kYXRhLCBhZXMoeD1sYWcpKSArIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApICsgeGxpbSg1MCwzMDApICsgZmFjZXRfd3JhcCggfiBzX251bSkKCiNnZ3Bsb3QobGFnX2RhdGEsIGFlcyh4PWxvZ19sYWcpKSAgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IC4wMSkgKyBmYWNldF93cmFwKCB+IHNfbnVtKQoKZmlsdF9sYWcgPC0gbGFnX2RhdGEgJT4lIGdyb3VwX2J5KHNfbnVtKSAlPiUgZmlsdGVyKGxvZ19sYWcgPCAobWVhbihsb2dfbGFnKSArIDIqc2QobG9nX2xhZykpICwgbG9nX2xhZyA+IChtZWFuKGxvZ19sYWcpIC0gMipzZChsb2dfbGFnKSkpICU+JSB1bmdyb3VwKCkKCmdncGxvdChmaWx0X2xhZywgYWVzKHg9bGFnKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwKSAgKyBmYWNldF93cmFwKH5zX251bSkgKyB4bGltKDUwLDM1MCkKCmdncGxvdChmaWx0X2xhZywgYWVzKHg9bG9nX2xhZykpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMDIpICsgZmFjZXRfd3JhcCh+c19udW0pCgpgYGAKCmBgYHtyfQojIyB3aXRoIGEgcnVuLCBwbG90IHRoZSBtZWFuIGxhZyAKcm91bmRfZmlsdF9sYWcgPC0gZmlsdF9sYWcgJT4lIAogIGdyb3VwX2J5KHNfbnVtLCBuX3RyYXZlbF9zdGVwcywgdHJhdmVsX2tleV9jb25kLCByb3VuZCwgcGhhc2UpICU+JQogIHN1bW1hcmlzZSh0cmlhbF9udW0gPSBmaXJzdCh0cmlhbF9udW0pLCBtZWFuX2xhZyA9IG1lYW4obGFnKSwgbWVhbl9sb2dfbGFnID0gbWVhbihsb2dfbGFnKSkgJT4lIG11dGF0ZShyb3VuZF9udW0gPSBhcy5pbnRlZ2VyKGFzLmNoYXJhY3Rlcihyb3VuZCkpKQoKZm9yIChzIGluIDE6MjIpewogIAogICMgcGxvdCBtZWFuIGxhZyBhcyBhIGZ1bmN0aW9uIG9mIHJvdW5kIG51bWJlcgogIHAgPC0gZ2dwbG90KHJvdW5kX2ZpbHRfbGFnICU+JSBmaWx0ZXIoc19udW0gPT0gcyksIGFlcyh4ID0gcm91bmRfbnVtLCB5ID0gbWVhbl9sb2dfbGFnLCBjb2xvciA9IHBoYXNlKSkgKyBnZW9tX3BvaW50KHNpemUgPSAyKSArZmFjZXRfZ3JpZChuX3RyYXZlbF9zdGVwcyB+IHRyYXZlbF9rZXlfY29uZCkgKyBnZW9tX2xpbmUoc2l6ZSA9IDEuMikgICsgeGxhYignaGFydmVzdC90cmF2ZWwgbnVtYmVyJykgKyB5bGFiKCdtZWFuIGxvZyBsYWcnKSArIGdndGl0bGUocGFzdGUoJ3N1Ymo6ICcsIHMpKSArIHRoZW1lX21pbmltYWwoKQogIHBsb3QocCkKICAKfQogCgpgYGAKYGBge3J9CmxpYnJhcnkocGxvdHJpeCkKY29uZF9yb3VuZF9maWx0X2xhZyA8LSByb3VuZF9maWx0X2xhZyAlPiUgCiAgZ3JvdXBfYnkobl90cmF2ZWxfc3RlcHMsIHRyYXZlbF9rZXlfY29uZCwgcm91bmRfbnVtLCBwaGFzZSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fbG9nX2xhZyA9IG1lYW4obWVhbl9sb2dfbGFnKSwgc2RfbGFnID0gc3RkLmVycm9yKG1lYW5fbG9nX2xhZykpCgpwIDwtIGdncGxvdChjb25kX3JvdW5kX2ZpbHRfbGFnLCBhZXMoeCA9IHJvdW5kX251bSwgeSA9IG1lYW5fbG9nX2xhZywgY29sb3IgPSBwaGFzZSkpICsgZ2VvbV9wb2ludChzaXplID0gMikgK2ZhY2V0X2dyaWQobl90cmF2ZWxfc3RlcHMgfiB0cmF2ZWxfa2V5X2NvbmQpICsgZ2VvbV9saW5lKHNpemUgPSAxLjIpICsgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBtZWFuX2xvZ19sYWcgLSBzZF9sYWcsIHltYXggPSBtZWFuX2xvZ19sYWcgKyBzZF9sYWcpKSArCiAgeGxhYignaGFydmVzdC90cmF2ZWwgbnVtYmVyJykgKyB5bGFiKCdtZWFuIGxvZyBsYWcnKSArIGdndGl0bGUoJ2dyb3VwOiAnKSArICB0aGVtZV9taW5pbWFsKCkKCnBsb3QocCkKYGBgCmBgYHtyfQpjb25kX3JvdW5kX2ZpbHRfbGFnCmBgYAoKCmBgYHtyfQoKdHJpYWxfZmlsdF9sYWcgPC0gcm91bmRfZmlsdF9sYWcgJT4lIAogIGdyb3VwX2J5KHNfbnVtLCBuX3RyYXZlbF9zdGVwcywgdHJhdmVsX2tleV9jb25kLCBwaGFzZSkgJT4lCiAgc3VtbWFyaXNlKHRyaWFsX251bSA9IGZpcnN0KHRyaWFsX251bSksIAogICAgICAgICAgICBtZWFuX2xhZyA9IG1lYW4obWVhbl9sYWcpLCAKICAgICAgICAgICAgbWVhbl9sb2dfbGFnID0gbWVhbihtZWFuX2xvZ19sYWcpKSAlPiUgdW5ncm91cCgpICU+JSBtdXRhdGUoc19udW0gPSBhcy5mYWN0b3Ioc19udW0pKQoKZ2dwbG90KHRyaWFsX2ZpbHRfbGFnLCAKICAgICAgIGFlcyh4ID0gZmFjdG9yKG5fdHJhdmVsX3N0ZXBzKSwgeSA9IG1lYW5fbG9nX2xhZywgZmlsbCA9IHNfbnVtKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvciA9IHNfbnVtKSwgc2l6ZSA9IDIpKyAKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc19udW0sIGNvbG9yID0gc19udW0pLCBzaXplID0gMS4yKSArCiAgZmFjZXRfZ3JpZChwaGFzZSB+IHRyYXZlbF9rZXlfY29uZCkgKyB0aGVtZV9taW5pbWFsKCkgKyB4bGFiKCcjIHRyYXZlbCBzdGVwcycpICsgeWxhYignbG9nIGxhZyB0aW1lJykKCmdncGxvdCh0cmlhbF9maWx0X2xhZywgCiAgICAgICBhZXMoeCA9IHRyYXZlbF9rZXlfY29uZCwgeSA9IG1lYW5fbGFnLCBmaWxsID0gc19udW0pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yID0gc19udW0pLCBzaXplID0gMikrIAogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzX251bSwgY29sb3IgPSBzX251bSksIHNpemUgPSAxLjIpICsKICBmYWNldF9ncmlkKHBoYXNlIH4gbl90cmF2ZWxfc3RlcHMpICsgdGhlbWVfbWluaW1hbCgpCmBgYAoKYGBge3J9Cgpncm91cF9sYWcgPC0gdHJpYWxfZmlsdF9sYWcgJT4lIGdyb3VwX2J5KG5fdHJhdmVsX3N0ZXBzLCB0cmF2ZWxfa2V5X2NvbmQsIHBoYXNlKSAlPiUgc3VtbWFyaXNlKGdtX2xhZyA9IG1lYW4obWVhbl9sYWcpLCBnbWxfbGFnID0gbWVhbihtZWFuX2xvZ19sYWcpKSAlPiUgdW5ncm91cCgpCgpnZ3Bsb3QoZ3JvdXBfbGFnLCBhZXMoeCA9IGZhY3RvcihuX3RyYXZlbF9zdGVwcyksIHkgPSBnbWxfbGFnLCBjb2xvciA9IHRyYXZlbF9rZXlfY29uZCkpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gdHJhdmVsX2tleV9jb25kKSwgc2l6ZSA9IDIpICsgZmFjZXRfd3JhcCh+cGhhc2UpICsgZ2VvbV9wb2ludChzaXplID0gMikgK3hsYWIoJyMgdHJhdmVsIHN0ZXBzJykgKwogIHlsYWIoJ2dyb3VwIG1lYW4gbG9nIGxhZycpICsgdGhlbWVfbWluaW1hbCgpCgoKYGBgCmBgYHtyfQpoYXJ2ZXN0X2xhZyA8LSByb3VuZF9maWx0X2xhZyAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIocGhhc2UgPT0gIkhBUlZFU1QiKSAlPiUgbXV0YXRlKHN1YmogPSBhcy5mYWN0b3Ioc19udW0pKQpoZWFkKGhhcnZlc3RfbGFnKQoKaGxfbW9kZWwgPC0gbG1lcihzY2FsZShtZWFuX2xvZ19sYWcpIH4gIG5fdHJhdmVsX3N0ZXBzICsgdHJhdmVsX2tleV9jb25kICsgcm91bmRfbnVtICArIHRyaWFsX251bSArICgxICsgbl90cmF2ZWxfc3RlcHMrIHRyYXZlbF9rZXlfY29uZCArIHJvdW5kX251bSArIHRyaWFsX251bSB8c3ViaiksIGRhdGEgPSBoYXJ2ZXN0X2xhZywgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9Im9wdGlteCIsb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpKQoKc3VtbWFyeShobF9tb2RlbCkKYGBgCgoKCmBgYHtyfQpsaWJyYXJ5KGJyb29tLm1peGVkKQp0ZCA8LSB0aWR5KGhsX21vZGVsLCBjb25mLmludCA9IFRSVUUpCnRkc29tZSA8LSB0ZCAlPiUgZmlsdGVyKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB8IHRlcm0gPT0gJ3RyYXZlbF9rZXlfY29uZEhBUkQnIHwgdGVybSA9PSAncm91bmRfbnVtJyB8IHRlcm0gPT0gJ3RyaWFsX251bScpCgp0ZHNvbWUgPC0gdGRzb21lICU+JSBtdXRhdGUocGFyYW1ldGVyID0gY2FzZV93aGVuKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB+ICd0cmF2ZWwgc3RlcCcsIHRlcm0gPT0gJ3RyYXZlbF9rZXlfY29uZEhBUkQnIH4gJ3RyYXZlbCBlZmZvcnQgY29uZCcsIHRlcm0gPT0gJ3JvdW5kX251bScgfiAncm91bmQgbnVtYmVyJywgdGVybSA9PSAndHJpYWxfbnVtJyB+ICd0cmlhbCBudW1iZXInKSkKCmdncGxvdCh0ZHNvbWUsIGFlcyhlc3RpbWF0ZSxwYXJhbWV0ZXIsY29sb3IgPSBwYXJhbWV0ZXIpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICArCmdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBzaXplID0gMS4yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB0aGVtZV9taW5pbWFsKCkgKyB5bGFiKCdmaXhlZCBlZmZlY3QnKSArIHhsYWIoJ2VzdGltYXRlIChzZCBsb2cgcnQpJykgKyBnZ3RpdGxlKCdsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbCAtIGVmZmVjdCBvbiBsYWcgLSBoYXJ2ZXN0IHByZXNzZXMnKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gLjUpKQoKYGBgCgpgYGB7cn0KdHJhdmVsX2xhZyA8LSByb3VuZF9maWx0X2xhZyAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIocGhhc2UgPT0gIlRSQVZFTCIpICU+JSBtdXRhdGUoc3ViaiA9IGFzLmZhY3RvcihzX251bSkpCgp0bF9tb2RlbCA8LSBsbWVyKHNjYWxlKG1lYW5fbG9nX2xhZykgfiAgbl90cmF2ZWxfc3RlcHMqdHJhdmVsX2tleV9jb25kICsgcm91bmRfbnVtICAgKyB0cmlhbF9udW0gKyAoMSArIG5fdHJhdmVsX3N0ZXBzKnRyYXZlbF9rZXlfY29uZCArIHJvdW5kX251bSArIHRyaWFsX251bSB8c3ViaiksIGRhdGEgPSB0cmF2ZWxfbGFnLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0ib3B0aW14IixvcHRDdHJsPWxpc3QobWV0aG9kPSdubG1pbmInKSkpCgpzdW1tYXJ5KHRsX21vZGVsKQoKYGBgCmBgYHtyfQp0cmF2ZWxfaGFyZF9sYWcgPC0gcm91bmRfZmlsdF9sYWcgJT4lIHVuZ3JvdXAoKSAlPiUgZmlsdGVyKHBoYXNlID09ICJUUkFWRUwiLCB0cmF2ZWxfa2V5X2NvbmQgPT0gIkhBUkQiKSAlPiUgbXV0YXRlKHN1YmogPSBhcy5mYWN0b3Ioc19udW0pKQoKdGhsX21vZGVsIDwtIGxtZXIoc2NhbGUobWVhbl9sb2dfbGFnKSB+ICBuX3RyYXZlbF9zdGVwcyArIHJvdW5kX251bSAgICsgdHJpYWxfbnVtICsgKDEgKyBuX3RyYXZlbF9zdGVwcyArIHJvdW5kX251bSArIHRyaWFsX251bSB8c3ViaiksIGRhdGEgPSB0cmF2ZWxfaGFyZF9sYWcsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSJvcHRpbXgiLG9wdEN0cmw9bGlzdChtZXRob2Q9J25sbWluYicpKSkKCnN1bW1hcnkodGhsX21vZGVsKQpgYGAKYGBge3J9CmxpYnJhcnkoYnJvb20ubWl4ZWQpCnRkIDwtIHRpZHkodGhsX21vZGVsLCBjb25mLmludCA9IFRSVUUpCnRkc29tZSA8LSB0ZCAlPiUgZmlsdGVyKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB8IHRlcm0gPT0gJ3RyYXZlbF9rZXlfY29uZEhBUkQnIHwgdGVybSA9PSAncm91bmRfbnVtJyB8IHRlcm0gPT0gInRyaWFsX251bSIpCgp0ZHNvbWUgPC0gdGRzb21lICU+JSBtdXRhdGUocGFyYW1ldGVyID0gY2FzZV93aGVuKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB+ICd0cmF2ZWwgc3RlcCcsIHRlcm0gPT0gJ3RyYXZlbF9rZXlfY29uZEhBUkQnIH4gJ3RyYXZlbCBlZmZvcnQgY29uZCcsIHRlcm0gPT0gJ3JvdW5kX251bScgfiAncm91bmQgbnVtYmVyJywgdGVybSA9PSAndHJpYWxfbnVtJyB+ICd0cmlhbCBudW1iZXInKSkKCmdncGxvdCh0ZHNvbWUsIGFlcyhlc3RpbWF0ZSxwYXJhbWV0ZXIsY29sb3IgPSBwYXJhbWV0ZXIpKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIpICArCmdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBzaXplID0gMS4yKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyB0aGVtZV9taW5pbWFsKCkgKyB5bGFiKCdmaXhlZCBlZmZlY3QnKSArIHhsYWIoJ3NkIGxvZyBsYWcnKSArIGdndGl0bGUoJ2xpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIC0gZWZmZWN0IG9uIGxhZyAtIGhhcmQgdHJhdmVsIHByZXNzZXMnKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gLjUpKQpgYGAKYGBge3J9CnRyYXZlbF9lYXN5X2xhZyA8LSByb3VuZF9maWx0X2xhZyAlPiUgdW5ncm91cCgpICU+JSBmaWx0ZXIocGhhc2UgPT0gIlRSQVZFTCIsIHRyYXZlbF9rZXlfY29uZCA9PSAiRUFTWSIpICU+JSBtdXRhdGUoc3ViaiA9IGFzLmZhY3RvcihzX251bSkpCgp0ZWxfbW9kZWwgPC0gbG1lcihzY2FsZShtZWFuX2xvZ19sYWcpIH4gIG5fdHJhdmVsX3N0ZXBzICsgcm91bmRfbnVtICAgKyB0cmlhbF9udW0gKyAoMSArIG5fdHJhdmVsX3N0ZXBzICsgcm91bmRfbnVtICsgdHJpYWxfbnVtIHxzdWJqKSwgZGF0YSA9IHRyYXZlbF9lYXN5X2xhZywgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9Im9wdGlteCIsb3B0Q3RybD1saXN0KG1ldGhvZD0nbmxtaW5iJykpKQoKc3VtbWFyeSh0ZWxfbW9kZWwpCgp0ZCA8LSB0aWR5KHRlbF9tb2RlbCwgY29uZi5pbnQgPSBUUlVFKQp0ZHNvbWUgPC0gdGQgJT4lIGZpbHRlcih0ZXJtID09ICduX3RyYXZlbF9zdGVwcycgfCB0ZXJtID09ICd0cmF2ZWxfa2V5X2NvbmRIQVJEJyB8IHRlcm0gPT0gJ3JvdW5kX251bScgfCB0ZXJtID09ICJ0cmlhbF9udW0iKQoKdGRzb21lIDwtIHRkc29tZSAlPiUgbXV0YXRlKHBhcmFtZXRlciA9IGNhc2Vfd2hlbih0ZXJtID09ICduX3RyYXZlbF9zdGVwcycgfiAndHJhdmVsIHN0ZXAnLCB0ZXJtID09ICd0cmF2ZWxfa2V5X2NvbmRIQVJEJyB+ICd0cmF2ZWwgZWZmb3J0IGNvbmQnLCB0ZXJtID09ICdyb3VuZF9udW0nIH4gJ3JvdW5kIG51bWJlcicsIHRlcm0gPT0gJ3RyaWFsX251bScgfiAndHJpYWwgbnVtYmVyJykpCgpnZ3Bsb3QodGRzb21lLCBhZXMoZXN0aW1hdGUscGFyYW1ldGVyLGNvbG9yID0gcGFyYW1ldGVyKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSAgKwpnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGNvbmYubG93LCB4bWF4ID0gY29uZi5oaWdoKSwgc2l6ZSA9IDEuMikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgdGhlbWVfbWluaW1hbCgpICsgeWxhYignZml4ZWQgZWZmZWN0JykgKyB4bGFiKCdzZCBsb2cgbGFnJykgKyBnZ3RpdGxlKCdsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbCAtIGVmZmVjdCBvbiBsYWcgLSB0cmF2ZWwgZWFzeSBwcmVzc2VzJykgKyB0aGVtZShheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IC41KSkKYGBgCmBgYHtyfQp0cmF2ZWxfbGFnIDwtIHJvdW5kX2ZpbHRfbGFnICU+JSB1bmdyb3VwKCkgJT4lIGZpbHRlcihwaGFzZSA9PSAiVFJBVkVMIikgJT4lIG11dGF0ZShzdWJqID0gYXMuZmFjdG9yKHNfbnVtKSkKCnRsX21vZGVsIDwtIGxtZXIoc2NhbGUobWVhbl9sb2dfbGFnKSB+ICBuX3RyYXZlbF9zdGVwcyp0cmF2ZWxfa2V5X2NvbmQgKyByb3VuZF9udW0gICArIHRyaWFsX251bSArICgxICsgbl90cmF2ZWxfc3RlcHMqdHJhdmVsX2tleV9jb25kICsgcm91bmRfbnVtICsgdHJpYWxfbnVtIHxzdWJqKSwgZGF0YSA9IHRyYXZlbF9sYWcsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSJvcHRpbXgiLG9wdEN0cmw9bGlzdChtZXRob2Q9J25sbWluYicpKSkKCnN1bW1hcnkodGxfbW9kZWwpCgojdGVybSA9PSAndHJhdmVsX2tleV9jb25kSEFSRCcKCnRkIDwtIHRpZHkodGxfbW9kZWwsIGNvbmYuaW50ID0gVFJVRSkKdGRzb21lIDwtIHRkICU+JSBmaWx0ZXIodGVybSA9PSAnbl90cmF2ZWxfc3RlcHMnICB8IHRlcm0gPT0gJ3JvdW5kX251bScgfCB0ZXJtID09ICJ0cmlhbF9udW0iIHwgdGVybSA9PSAibl90cmF2ZWxfc3RlcHM6dHJhdmVsX2tleV9jb25kSEFSRCIpCgp0ZHNvbWUgPC0gdGRzb21lICU+JSBtdXRhdGUocGFyYW1ldGVyID0gY2FzZV93aGVuKHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzJyB+ICcjIHN0ZXAnLCB0ZXJtID09ICd0cmF2ZWxfa2V5X2NvbmRIQVJEJyB+ICdlZmZvcnQnLCB0ZXJtID09ICdyb3VuZF9udW0nIH4gJ3JvdW5kJywgdGVybSA9PSAndHJpYWxfbnVtJyB+ICd0cmlhbCcsIHRlcm0gPT0gJ25fdHJhdmVsX3N0ZXBzOnRyYXZlbF9rZXlfY29uZEhBUkQnIH4gJyNzdGVwIHggZWZmb3J0JykpCgpnZ3Bsb3QodGRzb21lLCBhZXMoZXN0aW1hdGUscGFyYW1ldGVyLGNvbG9yID0gcGFyYW1ldGVyKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyKSAgKwpnZW9tX2Vycm9yYmFyaChhZXMoeG1pbiA9IGNvbmYubG93LCB4bWF4ID0gY29uZi5oaWdoKSwgc2l6ZSA9IDEuMikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgdGhlbWVfbWluaW1hbCgpICsgeWxhYignZml4ZWQgZWZmZWN0JykgKyB4bGFiKCdzZCBsb2cgbGFnJykgKyBnZ3RpdGxlKCdsaW5lYXIgbWl4ZWQgZWZmZWN0cyBtb2RlbCAtIGVmZmVjdCBvbiBsYWcgLSB0cmF2ZWwnKSArIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gLjUpKQpgYGAKYGBge3J9CnRkCmBgYAoK